/*/{Protheus.doc} SYNCSPE
E a User Function de geracao do layout SPE (Contas SPED) do Sistema Synchro
@author Elton Teodoro Alves
@since 14/11/2014
@version P11 R5
@Param aParam,Array,Array enviado pelo schudele
@Example
Esta User Function foi desenvolvida para ser utilizada com o Schudele, que passa como parametro para User Function um array com a seguinte configuracao:</br>
</br>
<table>
<tr><th> POSICAO </th><th> TIPO </th><th> DESCRICAO             </th></tr>
<tr><td> [01]    </td><td> C    </td><td> Codigo da Empresa     </td></tr>
<tr><td> [02]    </td><td> C    </td><td> Codigo da Filial      </td></tr>
<tr><td> [03]    </td><td> C    </td><td> Codigo do Agendamento </td></tr>
<tr><td> [04]    </td><td> C    </td><td> Codigo da Tarefa      </td></tr>
</table>
</br>	
Para teste fora do schudele, pode-se enviar para o SmartClient com a clausula -a estes dados separadas por virgula ',' Ex.: 99,01,0001,0001
/*/

#Define CRLF Chr(13) + Chr(10)
Static PERIOD := 'M'

#Include 'Protheus.ch'

User Function SYNCSPE(xParam)
	
	Local	cLayout		:=	Right(ProcName(),3)
	Local	aParam		:=	If(Valtype(xParam) == 'C',Separa(xParam,',',.T.),xParam)
	Local	aSyncEnv	:=	U_SYNCENV(aParam,cLayout,PERIOD)
	Local	cTrab		:=	GetNextAlias()
	Local	cTempTrab	:=	cLayout + Dtos(Date()) + StrTran(Time(),':','')
	Local	cTempFile	:=	GetSrvProfString("StartPath","") + cTempTrab + GetDbExtension()
	Local	cQuery		:=	''
	Local	cQueryBkp	:=	''
	Local	aStru		:=	{}
	Local	nX			:=	0
	Local	aFiliais	:=	StrTokArr(AllTrim(aSyncEnv[10]),'/',)
	Local	cFiliais	:=	''
	Local	nCount		:=	0
	Local	aEntPlan	:=	StrTokArr(AllTrim(GetMv('MV_SYNC003')),',',)
	Local	aLstCta		:=	{}
	Local	nQtdNiveis	:=	0
	Local	aNiveis		:=	{}
	Local	cNiveis		:=	''
	Local	nX			:=	0
	
	// Monta a string com a lista de filiais para ser utilizada na query
	
	For nX := 1 To Len(aFiliais)
		
		cFiliais += "'" + aFiliais[nX] + "'"
		
		If nX # Len(aFiliais)
			
			cFiliais += ","
			
		End If
		
	Next nX
	
	// --------------------------------------------------------------
	// Monta estrutura do arquivo temporario com dados a serem exportados
	// --------------------------------------------------------------
	aAdd(aStru,{'POS0001','C',0015,0}) // CODIGO ANALITICA
	aAdd(aStru,{'POS0016','C',0028,0}) // CODIGO CUSTO
	aAdd(aStru,{'POS0044','C',0030,0}) // CODIGO REFERENCIA
	aAdd(aStru,{'POS0074','C',0030,0}) // CODIGO AGLUTINACAO
	aAdd(aStru,{'POS0104','C',0018,0}) // CODIGO EST
	aAdd(aStru,{'POS0122','C',0040,0}) // CHAVE ORIGEM
	aAdd(aStru,{'POS0162','C',0010,0}) // ORIGEM
	aAdd(aStru,{'POS0172','C',0001,0}) // CTRL_INSTRUCAO
	
	// --------------------------------------------------------------
	
	If aSyncEnv[6] .And. Len(aEntPlan) == 2
		
		// --------------------------------------------------------------
		// Montagem da query de pesquisa
		// --------------------------------------------------------------
		cQuery += "SELECT " + CRLF
		
		cQuery += "CVD.CVD_CONTA POS0001," + CRLF
		cQuery += "CVD.CVD_CUSTO POS0016," + CRLF
		cQuery += "CVD.CVD_CTAREF POS0044," + CRLF
		cQuery += "CVD.CVD_CTAREF POS0074," + CRLF
		cQuery += "'' POS0104," + CRLF
		cQuery += "'DIXTAL' POS0122," + CRLF
		cQuery += "'DIXTAL' POS0162," + CRLF
		cQuery += "'I' POS0172" + CRLF
		
		cQuery += "FROM " + RetSqlName("CVD") + " CVD " + CRLF
		
		cQuery += "WHERE CVD.D_E_L_E_T_ <> '*' AND " + CRLF
		cQuery += "CVD.CVD_ENTREF = '" + aEntPlan[1] + "' AND " + CRLF
		cQuery += "CVD.CVD_CODPLA = '" + aEntPlan[2] + "' " + CRLF
		
		// --------------------------------------------------------------
		
		cQueryBkp	:=	cQuery
		
		cQuery := ChangeQuery(cQuery)
		
		If TcSqlExec(cQuery) < 0
			
			U_SYNCMAIL(AllTrim(aSyncEnv[15]),cLayout + ' - ' + AllTrim(aSyncEnv[17]),'Erro na execucao da query no banco de dados: ' + Chr(13) + Chr(10) + AllTrim(TcSqlError()),AllTrim(SubStr(aSyncEnv[4],1,6)),AllTrim(SubStr(aSyncEnv[4],7,6)),1,aSyncEnv[8],aSyncEnv[9])
			
		Else
			
			DbUseArea(.T.,"TOPCONN",TCGenQry(,,cQuery),cTrab,.F.,.T.)
			
			U_SYNCLOG(;
				'Agenda : ' +  SubStr(aSyncEnv[4],1,6) + CRLF +;
				'Tarefa : ' +  SubStr(aSyncEnv[4],7,6) + CRLF +;
				cLayout + ' - ' + AllTrim(aSyncEnv[17]) + CRLF +;
				'Query executada com sucesso: ' + CRLF + cQueryBkp)
			
			// Cria arquivo temporario
			
			fErase(Separa(cTempFile,'\',.T.)[3])
			DbCreate(cTempFile,aStru,__LocalDriver)
			DbUseArea(.T.,__LocalDriver,cTempFile,cTempTrab,.T.,.F.)
			
			U_SYNCLOG(;
				'Agenda : ' +  SubStr(aSyncEnv[4],1,6) + CRLF +;
				'Tarefa : ' +  SubStr(aSyncEnv[4],7,6) + CRLF +;
				'Arquivo Temporario criado com sucesso : ' + cTempFile)
			
			// --------------------------------------------------------------
			// Preenchimento do arquivo temporario
			// --------------------------------------------------------------
			
			(cTrab)->(DbGotop())
			
			Do While .Not. (cTrab)->(EOF())
				
				If aScan(aLstCta,SubStr(AllTrim((cTrab)->POS0001),7,7)) == 0 .And. SubStr(SubStr(AllTrim((cTrab)->POS0001),7,7),5,1) # '9'
					
					aAdd(aLstCta,SubStr(AllTrim((cTrab)->POS0001),7,7))
					
					aNiveis	:=	StrTokArr(AllTrim((cTrab)->POS0044),'.',.T.)
					
					For nX := 1 To Len(aNiveis)
						
						cNiveis	+=	aNiveis[nX]
						
						RecLock(cTempTrab,.T.)
						
						(cTempTrab)->POS0001 := SubStr(AllTrim((cTrab)->POS0001),7,7)
						(cTempTrab)->POS0016 := (cTrab)->POS0016
						(cTempTrab)->POS0044 := cNiveis
						(cTempTrab)->POS0074 := (cTrab)->POS0074
						(cTempTrab)->POS0104 := (cTrab)->POS0104
						(cTempTrab)->POS0122 := (cTrab)->POS0122
						(cTempTrab)->POS0162 := (cTrab)->POS0162
						(cTempTrab)->POS0172 := (cTrab)->POS0172
						
						MsUnLock()
						
						cNiveis	+= '.'
						
						nCount++
						
					Next nX
					
				End If
				
				cNiveis	:=	''
				
				(cTrab)->(DbSkip())
				
			End Do
			
			// --------------------------------------------------------------
			
			U_SYNCDAT(cTempTrab,aSyncEnv,nCount)
			
			(cTrab)->(DbCloseArea())
			(cTempTrab)->(DbCloseArea())
			fErase(Separa(cTempFile,'\',.T.)[3])
			
		End IF
		
	Else
		
		U_SYNCLOG(;
			'Agenda : ' +  SubStr(aSyncEnv[4],1,6) + CRLF +;
			'Tarefa : ' +  SubStr(aSyncEnv[4],7,6) + CRLF +;
			'Nao foi possivel montar o ambiente de geracao do layout ' + cLayout +;
			If(Len(aEntPlan) == 2,'','Verifique o conteudo do parametro MV_SYNC002' + CRLF))
		
	End IF
	
	RpcClearEnv()
	
Return
